package edu.ynu.se.xiecheng.achitectureclass.digitalagriculture.component;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import edu.ynu.se.xiecheng.achitectureclass.digitalagriculture.entity.DeviceEntity;
import edu.ynu.se.xiecheng.achitectureclass.digitalagriculture.utils.OkHttpUtils;

import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.IntStream;

/**
 * 传感器数据读取
 * 设计原则体现：
 * 1. 单一职责原则(SRP) - 该组件专注于土壤传感器相关的数据处理
 * 2. 组件化设计 - 将传感器功能封装为独立组件
 */
public class SoilComponent {

    public static void main(String[] args) throws Exception {
        getToken();

        /*List<String> lastSevenDays = getLastSevenDays();
        // 打印结果
        lastSevenDays.forEach(System.out::println);*/
    }

    /**
     * 获取最近七天日期
     * 设计原则体现：
     * 1. 高内聚 - 方法功能单一，职责明确
     * 2. 信息隐藏 - 内部实现细节对外部透明
     */
    public static List<String> getLastSevenDays() {

        List<String> list= Lists.newArrayList();

        // 获取今天的日期
        LocalDate today = LocalDate.now();

        // 获取最近一周的日期并转换为字符串
        IntStream.rangeClosed(-6, 0) // 从今天向前数6天，包含今天
                .mapToObj(today::plusDays) // 将天数转换为日期
                .map(date -> date.format(DateTimeFormatter.ISO_DATE)) // 将日期转换为字符串
                .forEach(e->{
                    list.add(e);
                }); // 打印日期字符串
        return list;
    }

    /**
     * 获取数据
     * 设计原则体现：
     * 1. 依赖注入(DI) - 通过参数传入设备列表和认证信息
     * 2. 松耦合 - 通过参数传递减少组件间直接依赖
     * 3. 接口隔离 - 明确定义了所需的参数接口
     */
    public static JSONArray getData(List<DeviceEntity> deviceEntityList, String boxId, String token) {

        JSONObject paramJson = new JSONObject();

        JSONArray paramArray = new JSONArray();

        for (DeviceEntity deviceEntity : deviceEntityList
        ) {
            paramArray.add(deviceEntity.getSn());
        }
        paramJson.put("ids", paramArray);

        System.out.println("paramJson=" + paramJson);
        System.out.println("token=" + token);
        try {
            String respData = OkHttpUtils.postJsonStringHead("https://fbox360.com/api/v2/dmon/value/get?boxNo=" + boxId, paramJson.toJSONString(), token);
            System.out.println(respData);
            JSONArray respArray = JSONArray.parseArray(respData);

            return respArray;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取token
     * 设计原则体现：
     * 1. 关注点分离 - 认证逻辑独立封装
     * 2. 封装变化 - 认证细节被封装在方法内部
     */
    public static String getToken() {

        JSONObject paramJson = new JSONObject();

        paramJson.put("scope", "fbox");
        paramJson.put("client_id", "68db2e8bda8d47b5b5db7eaf71c7dcdd");
        paramJson.put("client_secret", "76dc724c95004acab25482d344dab407");
        paramJson.put("grant_type", "client_credentials");

        try {
            String resp = OkHttpUtils.postMap("https://fbox360.com/idserver/core/connect/token", paramJson);
            JSONObject respJson = JSONObject.parseObject(resp);

            System.out.println(respJson);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return null;
    }
}
